[新機能] Amazon Redshift スキーマにストレージスペースのクォータが指定できるようになったので試してみました
データアナリティクス事業本部の石川です。クラスタバージョン1.0.14677からスキーマにストレージスペースのクォータが指定できるようになりました。AWSの大薗さんがヒントをくれたので試してみました。
Redshiftでスキーマ毎に容量制限を設定できるようになりましたよ。ユーザーごとにスキーマを開放しているけど容量無制限でオブジェクトを作らせたくない、といった要件に対応できます。地味に嬉しい機能だと思います!https://t.co/YTgiwHUqK1
— Junpei Ozono (@jostandard) April 21, 2020
クォータの設定
スキーマを作成する際にストレージスペースのクォータを指定します。
CREATE SCHEMA [ IF NOT EXISTS ] schema_name [ AUTHORIZATION username ] [ QUOTA {quota [MB | GB | TB] | UNLIMITED} ] [ schema_element [ ... ]
例えば、50GB割り当てる場合は以下のとおりです。
create schema us_sales authorization dwuser QUOTA 50 GB;
上記のスキーマの100GB割り当てに変更することも可能です。既存のテーブルに対してもクオータを設定、変更できます。
ALTER SCHEMA us_sales QUOTA 100 GB;
クオータに指定できるサイズは、2GB以上100TB以内です。
# ALTER SCHEMA qtest QUOTA 1 MB; ERROR: Schema quota must be between 2048 and 104857600 MB
クォータを試してみる
まずは、クォータが設定されていない普通のスキーマを作成します。
cm-redshiftdb=# CREATE SCHEMA qtest AUTHORIZATION cm_ishikawa_satoru; CREATE SCHEMA cm-redshiftdb=# SET search_path to 'qtest'; SET
上記のスキーマは、5GB割り当てに変更します。
cm-redshiftdb=# ALTER SCHEMA qtest QUOTA 5 GB; ALTER SCHEMA
qtestスキーマの中にlineorderテーブルを作成します。
cm-redshiftdb=# CREATE TABLE IF NOT EXISTS "qtest"."lineorder" cm-redshiftdb-# ( cm-redshiftdb(# "lo_orderkey" INTEGER NOT NULL ENCODE az64 cm-redshiftdb(# ,"lo_linenumber" INTEGER NOT NULL ENCODE delta cm-redshiftdb(# ,"lo_custkey" INTEGER NOT NULL ENCODE az64 cm-redshiftdb(# ,"lo_partkey" INTEGER NOT NULL ENCODE az64 cm-redshiftdb(# ,"lo_suppkey" INTEGER NOT NULL ENCODE az64 cm-redshiftdb(# ,"lo_orderdate" INTEGER NOT NULL ENCODE lzo cm-redshiftdb(# ,"lo_orderpriority" VARCHAR(15) NOT NULL ENCODE bytedict cm-redshiftdb(# ,"lo_shippriority" VARCHAR(1) NOT NULL ENCODE runlength cm-redshiftdb(# ,"lo_quantity" INTEGER NOT NULL ENCODE delta cm-redshiftdb(# ,"lo_extendedprice" INTEGER NOT NULL ENCODE lzo cm-redshiftdb(# ,"lo_ordertotalprice" INTEGER NOT NULL ENCODE lzo cm-redshiftdb(# ,"lo_discount" INTEGER NOT NULL ENCODE delta cm-redshiftdb(# ,"lo_revenue" INTEGER NOT NULL ENCODE lzo cm-redshiftdb(# ,"lo_supplycost" INTEGER NOT NULL ENCODE delta32k cm-redshiftdb(# ,"lo_tax" INTEGER NOT NULL ENCODE delta cm-redshiftdb(# ,"lo_commitdate" INTEGER NOT NULL ENCODE delta cm-redshiftdb(# ,"lo_shipmode" VARCHAR(10) NOT NULL ENCODE bytedict cm-redshiftdb(# ) cm-redshiftdb-# DISTSTYLE KEY cm-redshiftdb-# DISTKEY ("lo_partkey") cm-redshiftdb-# SORTKEY ( cm-redshiftdb(# "lo_orderdate" cm-redshiftdb(# ) cm-redshiftdb-# ; CREATE TABLE
上記のlineorderテーブルに約7.3GBのlineorder_sampleテーブルのデータをコピーします。しかし、クオータの5GBに達したため、データをコピーが中断します。
cm-redshiftdb=# SELECT size FROM svv_table_info WHERE "table" = 'lineorder_sample'; size ------ 7351 (1 row) cm-redshiftdb=# INSERT INTO "qtest"."lineorder" SELECT * FROM "cm_ishikawa_satoru"."lineorder_sample"; ERROR: Transaction 46821091 is aborted due to exceeding the disk space quota in schema(s): (Schema: qtest, Quota: 5120, Current Disk Usage: 7351). Free up disk space or request increased quota for the schema(s).
クオータの10GBに変更して、データのコピーを試みると成功します。
cm-redshiftdb=# ALTER SCHEMA qtest QUOTA 10 GB; ALTER SCHEMA cm-redshiftdb=# INSERT INTO "qtest"."lineorder" SELECT * FROM "cm_ishikawa_satoru"."lineorder_sample"; INSERT 0 182256332
すでにスキーマ内に7.3GBのデータがある状態で、クオータを5GBに設定してもエラーになりません。しかし、データを追加やテーブルを作成しようとするとエラーになります。
cm-redshiftdb=# ALTER SCHEMA qtest QUOTA 5 GB; ALTER SCHEMA cm-redshiftdb=# CREATE TABLE testtab(id int); ERROR: Transaction 46821572 is aborted due to exceeding the disk space quota in schema(s): (Schema: qtest, Quota: 5120, Current Disk Usage: 7351). Free up disk space or request increased quota for the schema(s).
最後に
複数の利用者がRedshiftを利用できるように、ユーザーごとにスキーマを作成して公開するときなど、スキーマごとにディスク容量を制限したい場合があります。まさに弊社内でも同じような状況なので、クオータを設定したいと考え始めています。「地味に嬉しい機能」、同感です。